/*! \file ModVetBit.c
	\brief Modulo Vetor de Bits.

	As Responsabilidades do vetor de Bits consistem em
	Gericiar os espacos livros de um certo arquivo de registros atraves de
	um arquivo binario.
 */

#define VetBit_Serv
#include "InVetBit.h"

//fazer o coment desse macro
#define EXTENCAO_VB ".bin"


FILE* AbreArquivoExten_VB (char*, char*, char*);
void FechaArqui_VB (FILE*);

void FechaArqui_VB (FILE* Arquivo) //fazer descri�ao /comentar
{
	fclose (Arquivo);
}

FILE* AbreArquivoExten_VB (char* NomeArqui, char* ExtenColo, char *TipoAbert) //fazer descri�ao /comentar
{
	char *NomeArquiBin;
	int TamanNomeArqui, TamanNomeExten;
	FILE *Arqui;

	TamanNomeArqui = strlen (NomeArqui);
	TamanNomeExten = strlen (ExtenColo);

	NomeArquiBin = (char*) malloc (sizeof (char) *(TamanNomeArqui + TamanNomeExten + 1));

	strcpy (NomeArquiBin, NomeArqui);
	strcat (NomeArquiBin, ExtenColo);

	Arqui = fopen (NomeArquiBin, TipoAbert);

	free (NomeArquiBin);

	return Arqui;
}

int LiberaRegistro_VB (int PosicNoArqui, char* NomeArqui) //comentar
{
	///Variaveis
	//ver se tem que fazer o comentario de cada uma
	char ExtenBinar[] = EXTENCAO_VB, TipoAbert[] = "r+w", Teste;
	FILE *ArquiBinar = NULL;

	///Pegando o Ponteriro Para o Arquivo Binario
	ArquiBinar = AbreArquivoExten_VB (NomeArqui, ExtenBinar, TipoAbert);
	if (ArquiBinar == NULL)
	{
		return -1;
	}
	///verifica se a posic e 0
	fseek (ArquiBinar, (PosicNoArqui - 1), SEEK_SET);
	fscanf (ArquiBinar, "%c", &Teste);
	if (Teste == '0')
	{
		return -1;
	}

	///Indo para a Posi�ao do Arquivo Que Sera Apagada
	fseek (ArquiBinar, (PosicNoArqui - 1), SEEK_SET);
	fprintf (ArquiBinar, "0");

	FechaArqui_VB (ArquiBinar);
	return 0;
}

ExtVB int PreencheRegistro_VB (char* NomeArqui) //comentar
{
	///Variaveis

	FILE *ArquiBinar = NULL;
	int PosicAtual = 0;
	char ExtenBinar[] = EXTENCAO_VB, TipoAbert[] = "r+w", CaracPego;

	///Pegando o Ponteriro Para o Arquivo Binario
	ArquiBinar = AbreArquivoExten_VB (NomeArqui, ExtenBinar, TipoAbert);
	if (ArquiBinar == NULL)
	{
		return -1;
	}

	///Procurando Pelo Zero
	while (!feof (ArquiBinar))
	{
		fscanf (ArquiBinar, "%c", &CaracPego);
		PosicAtual++;

		///Caso 0 encontradado coloca 1 no lugar e retorna-se a posi�ao
		if (CaracPego == '0')
		{
			fseek (ArquiBinar, (PosicAtual - 1), SEEK_SET);
			fprintf (ArquiBinar, "1");

			return PosicAtual;
		}
	}
	///Caso 0 Nao encontrado coloca-se 1 no final do aquivo e retorna - se o posi�ao final do arquivo
	fseek (ArquiBinar, 0, SEEK_END);
	fprintf (ArquiBinar, "1");

	FechaArqui_VB (ArquiBinar);

	return PosicAtual;
}

int ReatualizacaoVetBits_VB (char* NomeArqui, char* ExtenGerad, int TamanRegis, char CaracContr)//comentar
{
	///variaveis
	FILE *ArquiTexto = NULL;
	FILE *ArquiBinar = NULL;
	char ExtenBinar[] = EXTENCAO_VB, TipoAbertBinar[] = "w+", CaracPego;
	char TipoAbertArqui[] = "r";

	///abre os arquivos
	ArquiBinar = AbreArquivoExten_VB (NomeArqui, ExtenBinar, TipoAbertBinar);
	if (ArquiBinar == NULL)
	{
		return -1;
	}

	ArquiTexto = AbreArquivoExten_VB (NomeArqui, ExtenGerad, TipoAbertArqui);
	if (ArquiTexto == NULL)
	{
		return -1;
	}

	///faz o vetor
	fscanf (ArquiTexto, "%c", &CaracPego);
	while (!feof (ArquiTexto))
	{
		if (CaracPego == CaracContr)
		{
			fprintf (ArquiBinar, "0");
		}
		else
		{
			fprintf (ArquiBinar, "1");
		}
		fseek (ArquiTexto, TamanRegis + 1, SEEK_CUR);
		fscanf (ArquiTexto, "%c", &CaracPego);
	}

	return 0;
}
